package com.zenithmind.version.pojo.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 分支实体类
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("version_branch")
@Schema(description = "分支实体")
public class Branch extends BaseEntity {

    /**
     * 仓库ID
     */
    @Schema(description = "仓库ID")
    private String repositoryId;

    /**
     * 分支名称
     */
    @Schema(description = "分支名称")
    private String name;

    /**
     * 分支描述
     */
    @Schema(description = "分支描述")
    private String description;

    /**
     * 分支类型（1-主分支，2-开发分支，3-功能分支，4-修复分支，5-发布分支）
     */
    @Schema(description = "分支类型（1-主分支，2-开发分支，3-功能分支，4-修复分支，5-发布分支）")
    private Integer type;

    /**
     * 分支状态（0-删除，1-活跃，2-合并，3-保护）
     */
    @Schema(description = "分支状态（0-删除，1-活跃，2-合并，3-保护）")
    private Integer status;

    /**
     * 源分支ID
     */
    @Schema(description = "源分支ID")
    private String sourceBranchId;

    /**
     * 源分支名称
     */
    @Schema(description = "源分支名称")
    private String sourceBranchName;

    /**
     * 最新提交ID
     */
    @Schema(description = "最新提交ID")
    private String latestCommitId;

    /**
     * 最新提交哈希
     */
    @Schema(description = "最新提交哈希")
    private String latestCommitHash;

    /**
     * 最新提交时间
     */
    @Schema(description = "最新提交时间")
    private LocalDateTime latestCommitTime;

    /**
     * 是否受保护（0-否，1-是）
     */
    @Schema(description = "是否受保护（0-否，1-是）")
    private Integer isProtected;

    /**
     * 是否默认分支（0-否，1-是）
     */
    @Schema(description = "是否默认分支（0-否，1-是）")
    private Integer isDefault;

    /**
     * 创建者ID
     */
    @Schema(description = "创建者ID")
    private String creatorId;

    /**
     * 合并到分支ID
     */
    @Schema(description = "合并到分支ID")
    private String mergedToBranchId;

    /**
     * 合并时间
     */
    @Schema(description = "合并时间")
    private LocalDateTime mergedTime;

    /**
     * 合并者ID
     */
    @Schema(description = "合并者ID")
    private String mergedBy;

    /**
     * 检查是否为主分支
     *
     * @return 是否为主分支
     */
    public boolean isMainBranch() {
        return Integer.valueOf(1).equals(this.type);
    }

    /**
     * 检查是否为功能分支
     *
     * @return 是否为功能分支
     */
    public boolean isFeatureBranch() {
        return Integer.valueOf(3).equals(this.type);
    }

    /**
     * 检查是否为保护分支
     *
     * @return 是否为保护分支
     */
    public boolean isProtectedBranch() {
        return Integer.valueOf(1).equals(this.isProtected);
    }

    /**
     * 检查是否为默认分支
     *
     * @return 是否为默认分支
     */
    public boolean isDefaultBranch() {
        return Integer.valueOf(1).equals(this.isDefault);
    }

    /**
     * 检查分支是否活跃
     *
     * @return 是否活跃
     */
    public boolean isActive() {
        return Integer.valueOf(1).equals(this.status);
    }

    /**
     * 检查分支是否已合并
     *
     * @return 是否已合并
     */
    public boolean isMerged() {
        return Integer.valueOf(2).equals(this.status);
    }

    /**
     * 检查是否可以删除
     *
     * @return 是否可以删除
     */
    public boolean canBeDeleted() {
        return !isDefaultBranch() && !isProtectedBranch();
    }
}
